package repository

import (
	"context"
	"time"

	"github.com/google/uuid"
	"gorm.io/gorm"
	"techoiceness.com/aiagent/llm-gateway/internal/entity"
)

// SimpleToolRepository 简单工具仓储接口
type SimpleToolRepository interface {
	CreateTool(ctx context.Context, tool *entity.Tool) error
	GetTool(ctx context.Context, id uuid.UUID) (*entity.Tool, error)
	GetToolByName(ctx context.Context, name string) (*entity.Tool, error)
	GetToolsByNames(ctx context.Context, names []string) (map[string]*entity.Tool, error)
	UpdateTool(ctx context.Context, tool *entity.Tool) error
	DeleteTool(ctx context.Context, id uuid.UUID) error
	ListTools(ctx context.Context) ([]*entity.Tool, error)
	GetEnabledTools(ctx context.Context) ([]*entity.Tool, error)
	UpdateToolUsage(ctx context.Context, toolName string) error
}

// simpleToolRepository 简单工具仓储实现
type simpleToolRepository struct {
	db *gorm.DB
}

// NewSimpleToolRepository 创建简单工具仓储
func NewSimpleToolRepository(db *gorm.DB) SimpleToolRepository {
	return &simpleToolRepository{db: db}
}

// CreateTool 创建工具
func (r *simpleToolRepository) CreateTool(ctx context.Context, tool *entity.Tool) error {
	return r.db.WithContext(ctx).Create(tool).Error
}

// GetTool 获取工具
func (r *simpleToolRepository) GetTool(ctx context.Context, id uuid.UUID) (*entity.Tool, error) {
	var tool entity.Tool
	err := r.db.WithContext(ctx).First(&tool, "id = ?", id).Error
	if err != nil {
		return nil, err
	}
	return &tool, nil
}

// GetToolByName 根据名称获取工具
func (r *simpleToolRepository) GetToolByName(ctx context.Context, name string) (*entity.Tool, error) {
	var tool entity.Tool
	err := r.db.WithContext(ctx).First(&tool, "name = ?", name).Error
	if err != nil {
		return nil, err
	}
	return &tool, nil
}

// GetToolsByNames 根据名称批量获取工具
func (r *simpleToolRepository) GetToolsByNames(ctx context.Context, names []string) (map[string]*entity.Tool, error) {
	if len(names) == 0 {
		return make(map[string]*entity.Tool), nil
	}

	var tools []*entity.Tool
	err := r.db.WithContext(ctx).Where("name IN ?", names).Find(&tools).Error
	if err != nil {
		return nil, err
	}

	result := make(map[string]*entity.Tool, len(tools))
	for _, tool := range tools {
		result[tool.Name] = tool
	}
	return result, nil
}

// UpdateTool 更新工具
func (r *simpleToolRepository) UpdateTool(ctx context.Context, tool *entity.Tool) error {
	return r.db.WithContext(ctx).Save(tool).Error
}

// DeleteTool 删除工具
func (r *simpleToolRepository) DeleteTool(ctx context.Context, id uuid.UUID) error {
	return r.db.WithContext(ctx).Delete(&entity.Tool{}, "id = ?", id).Error
}

// ListTools 列出所有工具
func (r *simpleToolRepository) ListTools(ctx context.Context) ([]*entity.Tool, error) {
	var tools []*entity.Tool
	err := r.db.WithContext(ctx).Find(&tools).Error
	return tools, err
}

// GetEnabledTools 获取启用的工具
func (r *simpleToolRepository) GetEnabledTools(ctx context.Context) ([]*entity.Tool, error) {
	var tools []*entity.Tool
	err := r.db.WithContext(ctx).Where("is_enabled = ?", true).Find(&tools).Error
	return tools, err
}

// UpdateToolUsage 更新工具使用统计
func (r *simpleToolRepository) UpdateToolUsage(ctx context.Context, toolName string) error {
	now := time.Now()
	return r.db.WithContext(ctx).Model(&entity.Tool{}).
		Where("name = ?", toolName).
		Updates(map[string]interface{}{
			"usage_count":  gorm.Expr("usage_count + 1"),
			"last_used_at": now,
		}).Error
}
